Skip to content

Commit e92f43b

Browse files
committed
Improve release logging in RepoEditView
1 parent fbff615 commit e92f43b

File tree

1 file changed

+97
-31
lines changed

1 file changed

+97
-31
lines changed

components/modals/RepoFormModal.tsx

Lines changed: 97 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1870,6 +1870,7 @@ const CommitListItem: React.FC<CommitListItemProps> = ({ commit, highlight }) =>
18701870
};
18711871

18721872
const RepoEditView: React.FC<RepoEditViewProps> = ({ onSave, onCancel, repository, onRefreshState, setToast, confirmAction, defaultCategoryId, onOpenWeblink, detectedExecutables }) => {
1873+
const logger = useLogger();
18731874
const [formData, setFormData] = useState<Repository | Omit<Repository, 'id'>>(() => repository || NEW_REPO_TEMPLATE);
18741875

18751876
const repoIdForSuggestions = useMemo(() => {
@@ -2154,10 +2155,21 @@ const RepoEditView: React.FC<RepoEditViewProps> = ({ onSave, onCancel, repositor
21542155
if (!pat) {
21552156
setReleasesError("A GitHub Personal Access Token is required to manage releases. Please set one in Settings > Behavior.");
21562157
} else {
2157-
setReleasesError("Failed to fetch releases. This may be due to an invalid PAT or insufficient permissions (requires 'Contents: Read & write'). Check the debug console for more details.");
2158+
const errorMessage = "Failed to fetch releases. This may be due to an invalid PAT or insufficient permissions (requires 'Contents: Read & write'). Check the debug console for more details.";
2159+
logger.error('Failed to fetch releases for repository', {
2160+
repoId: repository.id,
2161+
repoName: repository.name,
2162+
error: errorMessage,
2163+
});
2164+
setReleasesError(errorMessage);
21582165
}
21592166
}
21602167
} catch (e: any) {
2168+
logger.error('Error while fetching releases', {
2169+
repoId: repository.id,
2170+
repoName: repository.name,
2171+
error: e,
2172+
});
21612173
setReleasesError(`Error: ${e.message}`);
21622174
} finally {
21632175
setReleasesLoading(false);
@@ -2835,59 +2847,113 @@ const RepoEditView: React.FC<RepoEditViewProps> = ({ onSave, onCancel, repositor
28352847
}, []);
28362848

28372849
const handleUpdateRelease = async (releaseId: number, options: Partial<ReleaseInfo>) => {
2838-
if (!repository) return;
2839-
const result = await window.electronAPI?.updateRelease({ repo: repository, releaseId, options });
2840-
if (result?.success) {
2841-
setToast({ message: 'Release updated.', type: 'success' });
2842-
fetchReleases();
2843-
} else {
2844-
setToast({ message: `Error: ${result?.error || 'API call failed.'}`, type: 'error' });
2850+
if (!repository) {
2851+
logger.warn('handleUpdateRelease called without repository context', { releaseId, options });
2852+
return;
2853+
}
2854+
2855+
const repoLogContext = { repoId: repository.id, repoName: repository.name, releaseId, options };
2856+
logger.info('Updating release', repoLogContext);
2857+
2858+
try {
2859+
const result = await window.electronAPI?.updateRelease({ repo: repository, releaseId, options });
2860+
2861+
if (result?.success) {
2862+
logger.info('Release update succeeded', repoLogContext);
2863+
setToast({ message: 'Release updated.', type: 'success' });
2864+
fetchReleases();
2865+
} else {
2866+
const errorMessage = result?.error || 'API call failed.';
2867+
logger.error('Release update failed', { ...repoLogContext, error: errorMessage });
2868+
setToast({ message: `Error: ${errorMessage}`, type: 'error' });
2869+
}
2870+
} catch (error) {
2871+
logger.error('Release update threw an exception', { ...repoLogContext, error });
2872+
setToast({ message: `Error: ${(error as Error).message}`, type: 'error' });
28452873
}
28462874
};
2847-
2875+
28482876
const handleDeleteRelease = async (releaseId: number) => {
2849-
if (!repository) return;
2877+
if (!repository) {
2878+
logger.warn('handleDeleteRelease called without repository context', { releaseId });
2879+
return;
2880+
}
2881+
2882+
logger.info('Preparing to delete release', { repoId: repository.id, repoName: repository.name, releaseId });
28502883
confirmAction({
28512884
title: 'Delete Release',
28522885
message: 'Are you sure you want to delete this release? This action cannot be undone.',
28532886
confirmText: 'Delete',
28542887
icon: <ExclamationTriangleIcon className="h-6 w-6 text-red-600" />,
28552888
onConfirm: async () => {
2856-
const result = await window.electronAPI?.deleteRelease({ repo: repository, releaseId });
2857-
if (result?.success) {
2858-
setToast({ message: 'Release deleted.', type: 'success' });
2859-
fetchReleases();
2860-
} else {
2861-
setToast({ message: `Error: ${result?.error || 'API call failed.'}`, type: 'error' });
2889+
try {
2890+
const result = await window.electronAPI?.deleteRelease({ repo: repository, releaseId });
2891+
if (result?.success) {
2892+
logger.info('Release deletion succeeded', { repoId: repository.id, repoName: repository.name, releaseId });
2893+
setToast({ message: 'Release deleted.', type: 'success' });
2894+
fetchReleases();
2895+
} else {
2896+
const errorMessage = result?.error || 'API call failed.';
2897+
logger.error('Release deletion failed', { repoId: repository.id, repoName: repository.name, releaseId, error: errorMessage });
2898+
setToast({ message: `Error: ${errorMessage}`, type: 'error' });
2899+
}
2900+
} catch (error) {
2901+
logger.error('Release deletion threw an exception', { repoId: repository.id, repoName: repository.name, releaseId, error });
2902+
setToast({ message: `Error: ${(error as Error).message}`, type: 'error' });
28622903
}
28632904
},
28642905
});
28652906
};
28662907

28672908
const handleSaveRelease = async () => {
2868-
if (!repository || !editingRelease) return;
2869-
2909+
if (!repository || !editingRelease) {
2910+
logger.warn('handleSaveRelease called without required context', {
2911+
hasRepository: Boolean(repository),
2912+
hasEditingRelease: Boolean(editingRelease),
2913+
});
2914+
return;
2915+
}
2916+
28702917
const options = {
28712918
tag_name: editingRelease.tagName!,
28722919
name: editingRelease.name!,
28732920
body: editingRelease.body || '',
28742921
draft: editingRelease.isDraft || false,
28752922
prerelease: editingRelease.isPrerelease || false,
28762923
};
2877-
2878-
let result;
2879-
if (editingRelease.isNew) {
2880-
result = await window.electronAPI?.createRelease({ repo: repository, options });
2881-
} else {
2882-
result = await window.electronAPI?.updateRelease({ repo: repository, releaseId: editingRelease.id!, options });
2883-
}
28842924

2885-
if (result?.success) {
2886-
setToast({ message: `Release ${editingRelease.isNew ? 'created' : 'saved'}.`, type: 'success' });
2887-
setEditingRelease(null);
2888-
fetchReleases();
2889-
} else {
2890-
setToast({ message: `Error: ${result?.error || 'API call failed.'}`, type: 'error' });
2925+
const logContext = {
2926+
repoId: repository.id,
2927+
repoName: repository.name,
2928+
releaseId: editingRelease.id ?? null,
2929+
tagName: editingRelease.tagName,
2930+
options,
2931+
isNew: Boolean(editingRelease.isNew),
2932+
};
2933+
2934+
logger.info('Saving release', logContext);
2935+
2936+
try {
2937+
let result;
2938+
if (editingRelease.isNew) {
2939+
result = await window.electronAPI?.createRelease({ repo: repository, options });
2940+
} else {
2941+
result = await window.electronAPI?.updateRelease({ repo: repository, releaseId: editingRelease.id!, options });
2942+
}
2943+
2944+
if (result?.success) {
2945+
logger.info('Release save succeeded', logContext);
2946+
setToast({ message: `Release ${editingRelease.isNew ? 'created' : 'saved'}.`, type: 'success' });
2947+
setEditingRelease(null);
2948+
fetchReleases();
2949+
} else {
2950+
const errorMessage = result?.error || 'API call failed.';
2951+
logger.error('Release save failed', { ...logContext, error: errorMessage });
2952+
setToast({ message: `Error: ${errorMessage}`, type: 'error' });
2953+
}
2954+
} catch (error) {
2955+
logger.error('Release save threw an exception', { ...logContext, error });
2956+
setToast({ message: `Error: ${(error as Error).message}`, type: 'error' });
28912957
}
28922958
};
28932959

0 commit comments

Comments
 (0)