Monday, 19 September 2011

RhodeCode open source HG (Mercurial) server

Download RhodeCode
* http://rhodecode.org/

Prerequisites
* Install Python 2.5 or later http://www.python.org/download/
* Add to PATH \Python27 and \Python27\Scripts folders
* Install SetupTools http://pypi.python.org/packages/2.7/s/setuptools/

Create \RhodeCode folder

Install RhodeCode
* easy_install rhodecode

Configure RhodeCode
* paster make-config RhodeCode production.ini
* paster setup-app production.ini

Run RhodeCode
* paster serve production.ini

Server is now running here http://localhost:8000

To change default host:port edit production.ini file

More info about installation and setup
http://packages.python.org/RhodeCode/installation.html
http://packages.python.org/RhodeCode/setup.html

Friday, 16 September 2011

C# Deep & Shallow Copy/Clone

class Program
{
  static void Main(string[] args)
  {
    var parent1 = new Parent() {Id = 1};
    parent1.Children = new List<Child>();
    parent1.Children.Add(new Child() { Name = "One" });
    parent1.Children.Add(new Child() { Name = "Two" });
    var parent2 = new Parent() { Id = 2 };
    parent2.Children = new List<Child>();
    parent2.Children.Add(new Child() { Name = "One" });
    parent2.Children.Add(new Child() { Name = "Two" });
    var parent3 = new Parent() { Id = 3 };
    parent3.Children = new List<Child>();
    parent3.Children.Add(new Child() { Name = "One" });
    parent3.Children.Add(new Child() { Name = "Two" });
    var parentShallowCopy = parent1.ShallowCopy();
    var parentDeepCopy = parent2.DeepCopy();
    var parentDeepClone = parent3.DeepClone();
    Console.WriteLine("ORIGINAL(1) : {0}", parent1);
    Console.WriteLine("SHALLOW COPY: {0}", parentShallowCopy);
    Console.WriteLine("ORIGINAL(2) : {0}", parent2);
    Console.WriteLine("DEEP COPY   : {0}", parentDeepCopy);
    Console.WriteLine("ORIGINAL(3) : {0}", parent3);
    Console.WriteLine("DEEP CLONE  : {0}", parentDeepClone);            
    parentShallowCopy.Children[0].Name = "Zero";
    parentDeepCopy.Children[0].Name = "Zero";
    parentDeepClone.Children[0].Name = "Zero";
    Console.WriteLine("");
    Console.WriteLine("ORIGINAL(1) : {0}", parent1);
    Console.WriteLine("SHALLOW COPY: {0}", parentShallowCopy);
    Console.WriteLine("ORIGINAL(2) : {0}", parent2);
    Console.WriteLine("DEEP COPY   : {0}", parentDeepCopy);
    Console.WriteLine("ORIGINAL(3) : {0}", parent3);
    Console.WriteLine("DEEP CLONE  : {0}", parentDeepClone); 
    Console.ReadLine();
  }
}
[Serializable]
class Parent
{
  public int Id { get; set; }
  public List<Child> Children { get; set; }
  public Parent ShallowCopy()
  {
    return (Parent)this.MemberwiseClone();
  }
  public Parent DeepCopy()
  {
    Parent other = (Parent)this.MemberwiseClone();
    other.Children = new List<Child>();
    this.Children.ForEach(x => other.Children.Add(x.DeepCopy()));            
    return other;
  }
  public override string ToString()
  {
    var sb = new StringBuilder();
    sb.AppendFormat("[Id:{0},Children:[", Id);
    Children.ForEach(x => sb.AppendFormat("{0},", x.ToString()));
    sb.Remove(sb.Length - 1, 1);
    sb.AppendFormat("]]");
    return sb.ToString();
  }
}
[Serializable]
class Child
{
  public string Name { get; set; }
  public override string ToString()
  {
    return string.Format("{0}", Name);
  }
  public Child ShallowCopy()
  {
    return (Child)this.MemberwiseClone();
  }
  public Child DeepCopy()
  {
    return (Child)this.MemberwiseClone();                        
  }
}
//extends classes that are marked [Serializable]
public static class ExtensionMethods
{        
  public static T DeepClone<T>(this T a)
  {
    using (MemoryStream stream = new MemoryStream())
    {
      BinaryFormatter formatter = new BinaryFormatter();
      formatter.Serialize(stream, a);
      stream.Position = 0;
      return (T)formatter.Deserialize(stream);
    }
  }
}

Tuesday, 13 September 2011

HG Mercurial Quick Setup Tutorial

Setting up Remote (build in) http server for multiple repositories

* Create Directory Structure

  - repo-root
   |- Project1.hg
   |- Project2.hg
   hgweb.config
   run.bat
 
* Edit hgweb.config as follows

  [collections]
  repos/ = .

  [web]
  style = gitweb
  push_ssl = false
  allow_push = *
 
* Edit run.bat as follows and run it

  hg serve --webdir-conf hgweb.config

Http Server is running on http://localhost:8000/ 
 

Setting up Remote Repository

* Create Folder /repo-root/Project1.hg
* Run hg init from within that folder


Setting up Local Repository

* Go to your local project directory /projects
* Clone remote repository locally

  hg clone http://localhost:8000/Project1.hg Project1

If you have an existing project and want to push it to remote repository

* Run hg push http://localhost:8000/Project1.hg

Or set default remote repository

* Create file /projects/Project1/.hg/hgrc
* Add this to file

  [paths]
  default =
http://localhost:8000/Project1.hg

* Now you can use hg push
 
Basic Commands

hg add (schedule files to be added to local repository)
hg commit (add files to local repository)
hg revert (revert changes to last commit)
hg push (push changes from remote repository)
hg pull (get changes from remote repository)
 

For more info look at Joel Spolsky Hg Init Mercurial Tutorial

Thursday, 8 September 2011

Simple XML based C# Database

public class DatabaseMgr
{
  public Database Database { get; set; }
  private static DatabaseMgr instance;
  private DatabaseMgr() { }
  public static DatabaseMgr Instance
  {
    get
    {
      if (instance == null)
      {
        instance = new DatabaseMgr();
      }
      return instance;
    }
  }
  //use temp path
  private static string PATH = Path.Combine(Path.GetTempPath(), "UserDatabase.xml");
  public void Reload()
  {
    if (File.Exists(PATH))
    {
      XmlSerializer xs = new XmlSerializer(typeof(Database));
      using (TextReader reader = new StreamReader(PATH))
      {
        Database = (Database)xs.Deserialize(reader);
        reader.Close();
      }
    }
    else
    {
      Database = new Database();                
    }
  }
  public void Save()
  {
    XmlSerializer xmlSerializer = new XmlSerializer(typeof(Database));
    using (TextWriter writer = new StreamWriter(PATH))
    {
      xmlSerializer.Serialize(writer, Database);
      writer.Close();
    }
  }
}
[Serializable]
public class Database
{
  public Database()
  {
    Users = new List<User>();            
  }
  [XmlArray]
  [XmlArrayItem(ElementName = "User")]
  public List<User> Users { get; set; }
}
[Serializable]
public class User
{
  [XmlElement]
  public string Name { get; set; }
  [XmlElement]
  public int Age { get; set; }
}
[Test]
public void Test()
{
  DatabaseMgr.Instance.Reload();
  DatabaseMgr.Instance.Database.Users.Add(new User() { Name = "John", Age = 25 });
  DatabaseMgr.Instance.Save();
  foreach (var user in DatabaseMgr.Instance.Database.Users)
  {
    Console.WriteLine("{0}=>{1}",user.Name,user.Age);
  }
}