using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Diagnostics;
using GCUpload;
namespace Release
{
class Program
{
static void Main(string[] args)
{
var versionsFile = @"C:\Projects\DesktopBrowser\trunk\Release\Versions.txt";
var lastVersion = File.ReadAllLines(versionsFile).Where(t => !String.IsNullOrEmpty(t)).LastOrDefault();
Console.WriteLine("Last version is: {0}, Enter new version:", lastVersion);
var version = Console.ReadLine();
var zipFile = "DesktopBrowser-" + version + ".zip";
var srcDir = @"C:\Projects\DesktopBrowser\trunk\";
var tempDir = @"c:\temp\DesktopBrowser";
VerifyDir(tempDir);
DeleteDirContents(tempDir);
CD(tempDir);
CopyDirContents(srcDir, tempDir, true, true);
DeleteFiles(new string[] { "*.sln", "*.pdb", "*.vshost.exe" });
DeleteDirectories(new string[] { "Release", "DesktopBrowser.Launcher" });
CD("DesktopBrowser");
DeleteFiles(new string[] { "*.cs", "*.pdb", "*.user", "*.csproj" }, true);
DeleteDirectories(new string[] { "Client", "Server", "obj", "Properties" });
CD("..");
if (File.Exists(zipFile))
File.Delete(zipFile);
ZipDirectory(tempDir, zipFile);
Console.WriteLine("Ready to upload to google code? press enter to continue");
Console.ReadLine();
WriteLine("uploading");
GoogleCodeUpload(new GoogleCodeUploadRequest
{
userName = "danelkhen",
password = File.ReadAllText(@"C:\Projects\GoogleCodePassword.txt"),
projectName = "desktopbrowser",
fileName = zipFile,
summary = "DesktopBrowser v" + version,
labels = new List<string> { "Featured", "Type-Executable", "OpSys-Windows" }
});
File.AppendAllLines(versionsFile, new []{version});
}
static void GoogleCodeUpload(GoogleCodeUploadRequest req)
{
FileUpload.UploadFile(req.userName, req.password, req.projectName, req.fileName, req.targetFileName, req.summary, req.labels, req.uploadUrl);
}
private static void WriteLine(string p)
{
Console.WriteLine(p);
}
static void CD(string dir)
{
Directory.SetCurrentDirectory(dir);
}
private static void DeleteFiles(string[] filenames, bool recursive = false)
{
var dir = Directory.GetCurrentDirectory();
filenames.ForEach(t => Directory.GetFiles(dir, t, recursive ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly).ForEach(x => File.Delete(x)));
}
private static void DeleteDirectories(string[] dirs)
{
dirs.ForEach(dir => Directory.Delete(dir, true));
}
static List<string> GetFiles(string dir, bool excludeHidden)
{
var files = Directory.GetFiles(dir).ToList();
if (excludeHidden)
files = files.Where(t => !File.GetAttributes(t).HasFlag(FileAttributes.Hidden)).ToList();
return files;
}
static List<string> GetDirectories(string dir, bool excludeHidden)
{
var dirs = Directory.GetDirectories(dir).ToList();
if (excludeHidden)
dirs = dirs.Where(t => !File.GetAttributes(t).HasFlag(FileAttributes.Hidden)).ToList();
return dirs;
}
static void CopyDirContents(string dir1, string dir2, bool recursive, bool excludeHidden)
{
VerifyDir(dir2);
GetFiles(dir1, excludeHidden).ForEach(t => File.Copy(t, Path.Combine(dir2, Path.GetFileName(t))));
if (recursive)
{
GetDirectories(dir1, excludeHidden).ForEach(innerDir =>
{
var innerDir2 = Path.Combine(dir2, Path.GetFileName(innerDir));
Directory.CreateDirectory(innerDir2);
CopyDirContents(innerDir, innerDir2, true, excludeHidden);
});
}
}
private static void DeleteDirContents(string dir)
{
Directory.GetFiles(dir, "*", SearchOption.AllDirectories).ForEach(t => File.Delete(t));
Directory.GetDirectories(dir).ForEach(t => Directory.Delete(t, true));
}
private static void VerifyDir(string dir)
{
if (dir.Length == 0)
return;
if (!Directory.Exists(dir))
Directory.CreateDirectory(dir);
}
static void ZipDirectory(string dir, string zipFile)
{
var prevDir = Directory.GetCurrentDirectory();
Console.WriteLine("Zipping");
Directory.SetCurrentDirectory(dir);
var process = Process.Start(@"C:\Program Files\7-Zip\7z.exe", "a " + zipFile);
process.WaitForExit();
Console.WriteLine("Finished zipping");
Directory.SetCurrentDirectory(prevDir);
}
}
public class GoogleCodeUploadRequest
{
public string userName { get; set; }
public string password { get; set; }
public string projectName { get; set; }
public string fileName { get; set; }
public string targetFileName { get; set; }
public string summary { get; set; }
public List<string> labels { get; set; }
public string uploadUrl { get; set; }
}
}