diff --git a/commitly b/commitly index 1d43f6b..a517fa6 100755 --- a/commitly +++ b/commitly @@ -57,6 +57,35 @@ (catch Exception e {:success false :repo repo-path :error (.getMessage e)}))) +(defn show-status [repo-path] + "Show git status for a repository" + (let [result (process/shell {:dir (str repo-path) + :out :string + :err :string + :continue true} + "git status")] + {:repo repo-path + :status (:out result)})) + +(defn status-all [] + "Show git status for all modified subrepos" + (let [current-dir (fs/cwd) + subrepos (find-subrepos current-dir) + modified-repos (filter has-changes? subrepos)] + + (when (empty? modified-repos) + (println "No repositories with changes found.") + (System/exit 0)) + + (println (format "Found %d repositories with changes:\n" (count modified-repos))) + + (doseq [repo modified-repos] + (let [repo-name (fs/file-name repo) + status-result (show-status repo)] + (println (str "=== " repo-name " ===")) + (println (:status status-result)) + (println))))) + (defn commitly [commit-message & {:keys [push?]}] "Main function: commit changes across all modified subrepos" (let [current-dir (fs/cwd) @@ -102,33 +131,45 @@ (if (empty? args) (do (println "Usage: commitly [-p] ") - (println " -p Push changes after committing (or just push if no message)") + (println " commitly status") + (println "") + (println "Options:") + (println " -p Push changes after committing (or just push if no message)") + (println " status Show git status for all subrepos with changes") (System/exit 1)) - (let [push? (some #(= "-p" %) args) - message-args (remove #(= "-p" %) args) - commit-message (str/join " " message-args)] - (if (and (str/blank? commit-message) push?) - ;; If -p is enabled and no message, just push without committing - (do - (println "No commit message provided with -p flag. Pushing only...") - (let [current-dir (fs/cwd) - subrepos (find-subrepos current-dir)] - (println "\nPushing changes...") - (let [push-results (map push-changes subrepos)] - (doseq [result push-results] - (if (:success result) - (println (format "✓ %s" (fs/file-name (:repo result)))) - (println (format "✗ %s: %s" (fs/file-name (:repo result)) (:error result))))) - (let [failed (filter #(not (:success %)) push-results)] - (when (seq failed) - (println (format "\n%d repositories failed to push" (count failed))) - (System/exit 1)))))) - ;; Otherwise, require commit message - (do - (when (str/blank? commit-message) - (println "Error: commit message cannot be empty") - (System/exit 1)) - (commitly commit-message :push? push?)))))) + (let [first-arg (first args)] + (cond + ;; Status command + (= "status" first-arg) + (status-all) + + ;; Commit/push command + :else + (let [push? (some #(= "-p" %) args) + message-args (remove #(= "-p" %) args) + commit-message (str/join " " message-args)] + (if (and (str/blank? commit-message) push?) + ;; If -p is enabled and no message, just push without committing + (do + (println "No commit message provided with -p flag. Pushing only...") + (let [current-dir (fs/cwd) + subrepos (find-subrepos current-dir)] + (println "\nPushing changes...") + (let [push-results (map push-changes subrepos)] + (doseq [result push-results] + (if (:success result) + (println (format "✓ %s" (fs/file-name (:repo result)))) + (println (format "✗ %s: %s" (fs/file-name (:repo result)) (:error result))))) + (let [failed (filter #(not (:success %)) push-results)] + (when (seq failed) + (println (format "\n%d repositories failed to push" (count failed))) + (System/exit 1)))))) + ;; Otherwise, require commit message + (do + (when (str/blank? commit-message) + (println "Error: commit message cannot be empty") + (System/exit 1)) + (commitly commit-message :push? push?)))))))) (when (= *file* (System/getProperty "babashka.file")) (apply -main *command-line-args*))