#!/usr/bin/perl # hgl use warnings; use strict; use File::Slurp; use File::Spec; use JSON::XS; use Data::Dumper; our $VERSION = '0.01'; my $mode; if($ARGV[0] =~ /^tip$|^diff$/){ $mode= shift @ARGV; }else{ $mode='commit'; } die "hg-lite (hgl) simple text-file version control.\n\nCommands:\n tip\tShow tip revision information.\n\nUsage: hgl [tip] \n" unless @ARGV; for my $path (@ARGV) { my $raw = read_file( $path ); if($mode eq 'tip'){ if($raw =~ /__HGLITE__/){ my ($file,$json) = split(/\n\n__HGLITE__\n/, $raw); my $data = JSON::XS->new->decode($json); my $tip = $#$data; print "\nRev:\t$tip (tip)\nFile:\t$path\t[Modified: ".localtime(${ $$data[-1]->{stat} }[9] )."]\n"; }else{ print "File is not versioned by hg-lite. Skipping.\n"; next; } }elsif($mode eq 'diff'){ if($raw =~ /__HGLITE__/){ my ($file,$json) = split(/\n\n__HGLITE__\n/, $raw); my $data = JSON::XS->new->decode($json); my $tip = $#$data; write_file("hglite.rev$tip.tmp", $$data[-1]->{raw}); write_file('hglite.curr.tmp', $file); my $diff = `diff -u hglite.rev$tip.tmp hglite.curr.tmp`; unlink("hglite.rev$tip.tmp"); unlink('hglite.curr.tmp'); if($diff eq ''){ print "No changes in $path. Skipping.\n"; next; }else{ print "$diff\n"; } }else{ print "File is not versioned by hg-lite. Skipping.\n"; next; } }else{ if($raw =~ /__HGLITE__/){ ## implicit commit my ($file,$json) = split(/\n\n__HGLITE__\n/, $raw); my $data = JSON::XS->new->decode($json); my $tip = $#$data; ## diff curr against prev version write_file("hglite.rev$tip.tmp", $$data[-1]->{raw}); write_file('hglite.curr.tmp', $file); my $diff = `diff hglite.rev$tip.tmp hglite.curr.tmp`; if($diff eq ''){ print "No changes in $path. Skipping.\n"; next; } unlink("hglite.rev$tip.tmp"); unlink('hglite.curr.tmp'); ## write our custom weave my @stat = stat($path); $stat[7] = length($file); delete($$data[-1]->{raw}); my @path = File::Spec->splitpath( $path ); push(@$data,{ filename => $path[-1], stat => \@stat, diff => $diff, raw => $file }); $json = JSON::XS->new->pretty->encode($data); write_file($path, $file."\n\n__HGLITE__\n".$json); }else{ ## implicit init print "Versioning init.\n"; ## diff against null write_file('hglite.null.tmp', ''); write_file('hglite.rev0.tmp', $raw); my $diff = `diff hglite.null.tmp hglite.rev0.tmp`; unlink('hglite.null.tmp'); unlink('hglite.rev0.tmp'); ## write our custom weave my $data = []; my @stat = stat($path); my @path = File::Spec->splitpath( $path ); push(@$data,{ filename => $path[-1], stat => \@stat, diff => $diff, raw => $raw }); my $json = JSON::XS->new->pretty->encode($data); write_file($path, $raw."\n\n__HGLITE__\n".$json); } } }