]>
git.defcon.no Git - trk/blob - trk
3895640523f3b9a7f9e09456d88cde46cb69586b
3 use Digest
::MD5
qw(md5_hex);
8 my $trk_dir = "$ENV{HOME}/.trk";
20 printf("It seems you require assistance\n");
24 printf("How to start\n") if $code == START
;
25 printf("How to time\n") if $code == TIMEFORMAT
;
33 my $id_length = shift;
34 $id_length = 32 if not defined $id_length;
38 for(my $i=0 ; $i<128;)
40 my $tc = chr(int(rand(127)));
41 if($tc =~ /[a-zA-Z0-9]/)
49 while ( length($w) < $id_length )
51 $w .= gen_puuid
( $id_length - length( $w ) );
54 $w = substr( $w, 0, $id_length );
58 # Input to parse_time is:
59 # * date -> date-string in the form YYYY-MM-DD
60 # * time -> time-string in the form HH:MM
61 # Return value is a unix timestamp, as returned by time()
64 my ( $Y, $M, $D ) = split ("-", shift );
65 my ( $h, $m ) = split(":", shift );
66 return timelocal
(0, $m, $h, $D, ($M-1), $Y);
73 return 0 if not $i =~ m/(\d\d\d\d-\d\d-\d\d) (\d\d:\d\d)/;
74 return parse_time
($1, $2);
80 return strftime
("%Y-%m-%d %H:%M", localtime($t));
83 sub parse_arguments
($)
88 my $start_time = time;
91 if (( $#ARGV >= 1) && ( $ARGV[1] eq "at" ))
93 # Start and Activity require a title to be present.
94 # All other (stop, main...) do not ^^.
95 if ( ($step == START
) || ($step == TASK
) )
97 # TODO: Allow no title!
98 # If no title is given, read ID of previously used project in stead :)
99 help
($step) unless $#ARGV > 3;
100 $title = join(" ", @ARGV[4..$#ARGV]);
102 help
(TIMEFORMAT
) unless ( $ARGV[2] =~ m/\d\d\d\d-\d\d-\d\d/ && $ARGV[3] =~ m/\d\d:\d\d/);
104 $start_time = parse_time
( $ARGV[2], $ARGV[3] );
106 elsif ( ($step == START
) || ($step == TASK
) || ($step == EDIT
))
109 $title = join(" ", @ARGV);
112 if ( not defined $title )
118 return ( $start_time, $title );
124 return undef if ( ! -f
$trk_dir . "/last" );
125 open ( CUR
, "<" . $trk_dir . "/last" ) or die ("Unable to read last project file");
132 sub get_current_project
134 return undef if ( ! -f
$trk_dir . "/current" );
135 open ( CUR
, "<" . $trk_dir . "/current" ) or die ("Unable to read current project file");
142 sub set_current_project
($)
145 return undef if ( -f
$trk_dir . "/current" );
146 open ( CUR
, ">" . $trk_dir . "/current" ) or die ("Unable to write current project file");
147 printf(CUR
"%s\n", $id );
150 open ( LAST
, ">" . $trk_dir . "/last" ) or die ("Unable to write last project file");
151 printf(LAST
"%s\n", $id );
157 my $project = get_current_project
();
158 return undef if not $project;
160 open ( CUR
, "<" . $trk_dir . "/current" ) or die ("Unable to read current project file");
173 foreach my $d ( <$trk_dir/*> )
176 next if not -f
$d . "/info";
178 my $id = basename
($d);
179 my $title = get_project_name
( $id );
181 $projects{$id} = $title unless not defined $title;
188 sub get_project_id
($)
192 # Get hash of project-id's and -names from get_projects
193 my $projects = get_projects
();
195 # Look up name in list
196 foreach my $id ( keys $projects )
199 return $id if ( $projects->{$id} eq $title )
202 # If no match, return undef.
206 sub get_project_name
($)
209 open(PRO
, "<" . $trk_dir . "/" . $id . "/info" ) or die ("Unable to read project medatata file!");
213 next if not $_ =~ /^title:(.*)/;
220 sub create_project
($)
229 } while ( -d
$trk_dir . "/" . $id );
230 mkdir ( $trk_dir . "/" . $id );
232 open(PRO
, ">" . $trk_dir . "/" . $id . "/info" ) or die ("Unable to create project medatata file!");
233 printf(PRO
"title:%s\n", $title);
239 ############################################################
243 mkdir $trk_dir or die("Unable to create data directory");
251 my $command = $ARGV[0];
253 if ( ( $command eq "start") || ($command eq "on" ) )
260 my ( $start_time, $title ) = parse_arguments
(START
);
262 my $current = get_current_project
();
265 $current = get_project_id
( $title );
268 printf("No project by that name! Creating a new one.\n");
269 $current = create_project
($title);
273 printf("Continuing tracking for existing project.\n");
275 set_current_project
($current);
279 printf("A project is being tracked: %s\n", get_project_name
( $current ) );
280 printf("Stop current tracking before starting a new one\n");
284 # First iteration is VERY naive: simply add the start time to the bottom of the tracking file
285 # Will have to do more logic: if the start point is before one of the times already in the track,
286 # the file will have to be manipulated to get coherent tracking!
287 open (TRACK
, ">>" . $trk_dir . "/" . $current . "/tracking" ) or die ("Unable to open file, $!");
288 printf(TRACK
"[%s]", time2str
($start_time));
291 printf("Started tracking of '%s' at %s\n\n", $title, scalar localtime $start_time);
293 elsif ( ( $command eq "stop") || ($command eq "off" ) )
301 my $stop_time = parse_arguments
(STOP
);
303 my $current = get_current_project
();
306 printf("No project is currently tracked. To stop, please start first\n");
309 my $title = get_project_name
( $current );
311 die ("Project exists, but tracking file does not!") if ( not -f
$trk_dir . "/" . $current . "/tracking" );
313 # First iteration is VERY naive: simply add the stop time to the bottom line of the tracking file
314 # Will have to do more logic: if the start point is before one of the times already in the track,
315 # the file will have to be manipulated to get coherent tracking!
316 # In addtion to this: actually do some file sanity checking!
317 open (TRACK
, ">>" . $trk_dir . "/" . $current . "/tracking" ) or die ("Unable to open file, $!");
318 printf(TRACK
" to [%s]\n", time2str
($stop_time));
321 unlink ( $trk_dir . "/current" );
323 printf("Stopped tracking of '%s' at %s\n\n", $title, scalar localtime $stop_time);
325 elsif ( ( $command eq "projects" ) || ( $command eq "list" ) )
327 # Todo/future extensions:
328 # TODO: Sort list of names alphabetically
329 # TODO: Get total-hours for projects
331 my $projects = get_projects
();
332 printf("Currently tracked project names:\n\n");
333 my $current = get_current_project
();
335 foreach my $id ( keys $projects )
337 printf(" %s %s\n", ($id eq $current ?
">" : " " ),$projects->{$id} );
341 elsif ( $command eq "edit" )
344 my ( undef, $title ) = parse_arguments
(EDIT
);
345 my $id = get_last_project
();
349 $id = get_project_id
($title);
352 printf("No project by that name. Try 'list'\n");
357 system( "/usr/bin/editor " . $trk_dir . "/" . $id . "/tracking" );