54 lines
1.5 KiB
Python
54 lines
1.5 KiB
Python
import subprocess
|
||
from datetime import datetime, timedelta
|
||
|
||
# Run git log command
|
||
log_output = subprocess.check_output(
|
||
['git', 'log', '--pretty=format:%h %an %ad', '--date=iso'],
|
||
text=True
|
||
)
|
||
|
||
# Parse commit dates
|
||
commit_times = []
|
||
for line in log_output.splitlines():
|
||
parts = line.strip().split()
|
||
if len(parts) < 4:
|
||
continue
|
||
# Commit hash, author, datetime string
|
||
dt_str = " ".join(parts[2:4]) # "YYYY-MM-DD HH:MM:SS"
|
||
try:
|
||
dt = datetime.strptime(dt_str, "%Y-%m-%d %H:%M:%S")
|
||
commit_times.append(dt)
|
||
except ValueError:
|
||
continue
|
||
|
||
# Sort commits chronologically
|
||
commit_times.sort()
|
||
|
||
# Session grouping (commits < 1 hour apart are same session)
|
||
SESSION_GAP = timedelta(hours=1)
|
||
sessions = []
|
||
if commit_times:
|
||
start = commit_times[0]
|
||
prev = commit_times[0]
|
||
|
||
for t in commit_times[1:]:
|
||
if t - prev > SESSION_GAP:
|
||
# Close previous session
|
||
sessions.append((start, prev))
|
||
start = t
|
||
prev = t
|
||
sessions.append((start, prev)) # last session
|
||
|
||
# Estimate durations
|
||
total_time = timedelta()
|
||
for start, end in sessions:
|
||
duration = end - start
|
||
# Add a minimum session length (e.g. 30 min) so single commits aren’t near-zero
|
||
if duration < timedelta(minutes=30):
|
||
duration = timedelta(minutes=30)
|
||
total_time += duration
|
||
|
||
print(f"Number of commits: {len(commit_times)}")
|
||
print(f"Number of sessions: {len(sessions)}")
|
||
print(f"Estimated total coding time: {total_time} (~{total_time.total_seconds()/3600:.1f} hours)")
|