Review of "Timelogs Extension" version 1.0.2 (3)

Details Page Preview

Track time spent on GitLab issues. This extension is not affiliated, funded, or in any way associated with GitLab. Track time spent on GitLab issues from the GNOME top bar. Select projects and issues, run a persistent timer, submit time directly to GitLab, and generate monthly reports. This is an experimental personal fork of Gecka-Apps/gitlab-time-tracker. It was developed primarily through AI-assisted programming. Updates and support are not guaranteed. Requires a GitLab personal access token with the api scope which will be stored cleartext in GSettings.

Extension Homepage
https://github.com/heno-dm/gitlab-time-tracker

No comments.

Diff Against

Files

Note: Binary files aren't shown on the web site. To see all files, please download the extension zipfile.

Shexli (experimental) warning 6

Shexli found 6 issues that may need reviewer attention.

EGO-P-007 warning

JavaScript files should be reachable from extension.js or prefs.js

Some JavaScript files are not reachable from `extension.js` or `prefs.js` imports.

Don't include unnecessary files

  • reportWindow.js

EGO-L-001 warning

extension must not create GObject instances or modify shell before enable()

Resource creation or signal/source setup was found outside `enable()`.

Only use initialization for static resources

  • selectorWindow.js:528
    new Gtk.Application({
        application_id: 'com.github.heno_dm.TimelogsExtension.Selector',
        flags: Gio.ApplicationFlags.FLAGS_NONE,
    })
  • selectorWindow.js:533
    app.connect('activate', application => {
        const window = new SelectorWindow(application);
        window.present();
    })

EGO-L-005 warning

owned object references should be released in disable()

Owned references that are cleaned up in `disable()` should also be released with `null` or `undefined`.

Destroy all objects

  • selectorWindow.js:41
    this._settings = getSettings()

EGO-L-003 warning

signals connected by extension should be disconnected in disable()

Signals assigned in `enable()` are missing matching disconnect calls in `disable()` or its helper methods.

Disconnect all signals

  • selectorWindow.js:159
            this._issueAssigneeEntry.connect('changed', () => {
                this._settings.set_string('issue-filter-assignee', this._issueAssigneeEntry.get_text().trim());
                this._scheduleIssueReload();
            })
  • selectorWindow.js:170
            this._issueLabelsEntry.connect('changed', () => {
                this._settings.set_string('issue-filter-labels', this._issueLabelsEntry.get_text().trim());
                this._scheduleIssueReload();
            })
  • selectorWindow.js:183
            this._issueList.connect('row-selected', (_list, row) => {
                this._selectedIssue = row?._issue || null;
                this._selectButton.sensitive = Boolean(this._selectedProject && this._selectedIssue);
            })
  • selectorWindow.js:134
            this._issueSearchEntry.connect('search-changed', () => {
                this._settings.set_string('issue-filter-search', this._issueSearchEntry.get_text());
                this._scheduleIssueReload();
            })
  • selectorWindow.js:146
            this._issueStateDropdown.connect('notify::selected', widget => {
                const selected = widget.get_selected();
                const state = this._issueStateValues[selected] || 'opened';
                this._settings.set_string('issue-filter-state', state);
                this._reloadIssues();
     
  • selectorWindow.js:196
    this._loadMoreButton.connect('clicked', () => this._loadMoreIssues())
  • selectorWindow.js:106
            this._projectList.connect('row-selected', (_list, row) => {
                if (row?._project)
                    this._selectProject(row._project);
            })
  • selectorWindow.js:96
    this._projectSearchEntry.connect('search-changed', () => this._updateProjectList())
  • selectorWindow.js:216
    this._selectButton.connect('clicked', () => this._sendSelection())

EGO-L-008 warning

Soup.Session instances should be aborted during cleanup

Soup.Session instances should be aborted during cleanup.

Soup.Session.abort

  • selectorWindow.js:42
    this._httpSession = new Soup.Session()

EGO-L-004 warning

main loop sources should be removed in disable()

Main loop sources assigned in `enable()` are missing matching removals in `disable()` or its helper methods.

Remove main loop sources

  • selectorWindow.js:352
            this._issueReloadId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 300, () => {
                this._issueReloadId = null;
                this._reloadIssues();
                return GLib.SOURCE_REMOVE;
            })

All Versions

Version Status
1.0.2 (3) Unreviewed
1.0.1 (2) Rejected
1.0.0 (1) Rejected